﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Reflection;

using Ylh.BLL;

public partial class UpdateDataBase : PageBase
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            GetMessage(false );
        }

    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        GetMessage(true);
    }
    private void GetMessage(bool IsExcute)
    {
        SystemInfoBLL SysInfo = new SystemInfoBLL(DbConnectionStr);

        //获取指定的数据库中的VersionCode
        string VersionCode = SysInfo.GetVersionCode();

        string connstr =DbConnectionStr;
        string MaxVersion = string.Empty;
        //定义数据集，用于显示升级脚本执行情况
        DataTable dt = new DataTable();
        dt.Columns.Add("message");

        //什么是Assembly(程序集)?
        //Assembly是一个包含来程序的名称，版本号，自我描述，文件关联关系和文件位置等信息的一个集合。在.net框架中通过Assembly类来支持，该类位于System.Reflection下，物理位置位于：mscorlib.dll。

        //Assembly能干什么？
        //我们可以通过Assembly的信息来获取程序的类，实例等编程需要用到的信息。

        //读取文件，并且初始化Assembly对象
        Assembly assemly = Assembly.LoadFrom(Server.MapPath("~/Bin/UpdateDatabase.dll"));

        //获取文件中包含的所有程序
        Type[] theassem = assemly.GetTypes().OrderBy(th => th.Name).ToArray();

        foreach (Type t in theassem)
        {
            //使用默认构造函数，实例化对象
            Object obj = Activator.CreateInstance(t);
            //获取程序集中所有包含ExecuteSQL名称的方法
            MethodInfo[] Mi = t.GetMethods().OrderBy(th => th.Name).Where(th => th.Name.Contains("ExecuteSQL")&& GetVersion(th.Name) > Convert.ToDecimal(VersionCode)).ToArray();

            //遍历Mi方法组

            foreach (MethodInfo mifo in Mi)
            {
                //第二个参数调用MethodInfo实体的Invoke方法，并且执行
                //其中obj为载上面实例化的当前类，
                //new object[] { true } 为调用当前类中所有的方法
                UnionTable(dt, mifo.Invoke(obj, new object[] { IsExcute, connstr }) as List<string>, mifo.Name.Replace("ExecuteSQL", ""));
                //取出最后执行的方法的时间，作为当前数据库的版本号
                MaxVersion = mifo.Name.Replace("ExecuteSQL", "");
            }
        }
        GridView1.DataSource = dt;
        GridView1.DataBind();


        bool IsAllExcuteSuccess = true;
        foreach (DataRow s in dt.Rows)
        {
            if (!s[0].ToString().Contains("成功"))
            {
                IsAllExcuteSuccess = false;
                break;
            }
        }

        if (IsAllExcuteSuccess && dt.Rows.Count !=0)
        {
            SystemInfoBLL bll = new SystemInfoBLL(DbConnectionStr);
        bll.UpdataVersionCode(MaxVersion);
        }
        
        

        


    }

    /// <summary>
    /// 添加数据库脚本执行后信息，用于绑定页面Gridview控件
    /// </summary>
    /// <param name="dt">数据集</param>
    /// <param name="list">方法执行后信息</param>
    /// <param name="date">方法名（取脚本更新时间，而不是脚本执行时间）</param>
    public void UnionTable(DataTable dt, List<string> list, string date)
    {
        foreach (string str in list)
        {
            DataRow dr = dt.NewRow();

            dr[0] = date + str;

            dt.Rows.Add(dr);
        }
    }

    /// <summary>
    /// 获取版本信息
    /// </summary>
    /// <param name="name">当前方法的名称</param>
    /// <returns></returns>
    public decimal GetVersion(string name)
    {
        return Convert.ToDecimal(name.Replace("ExecuteSQL", ""));
    }

}